﻿using System;
using System.Collections.ObjectModel;
using System.ComponentModel.DataAnnotations;
using System.ServiceModel.DomainServices.Client.ApplicationServices;

namespace IssueVision.Data.Web
{
    /// <summary>
    /// Issue class client-side extensions
    /// </summary>
    public partial class Issue
    {
        /// <summary>
        /// Try validate for the Issue class
        /// </summary>
        /// <returns></returns>
        public bool TryValidateObject()
        {
            var context = new ValidationContext(this, null, null);
            var validationResults = new Collection<ValidationResult>();

            if (Validator.TryValidateObject(this, context, validationResults, false) == false)
            {
                foreach (ValidationResult error in validationResults)
                {
                    ValidationErrors.Add(error);
                }
                return false;
            }

            return true;
        }

        /// <summary>
        /// Try validate the specified property for Issue class
        /// </summary>
        /// <param name="propertyName"></param>
        /// <returns></returns>
        public bool TryValidateProperty(string propertyName)
        {
            if (string.IsNullOrEmpty(propertyName))
            {
                throw new ArgumentNullException("propertyName");
            }

            if (propertyName == "IssueID" || propertyName == "Title")
            {
                var context = new ValidationContext(this, null, null) { MemberName = propertyName };

                var validationResults = new Collection<ValidationResult>();

                if (propertyName == "IssueID")
                    return Validator.TryValidateProperty(IssueID, context, validationResults);
                if (propertyName == "Title")
                    return Validator.TryValidateProperty(Title, context, validationResults);
            }
            return false;
        }

        /// <summary>
        /// Business logic:
        /// Admin user can read/update any issue, and
        /// normal user can only read/update issues assigned to them
        /// or issues created by them and have not assigned to anyone.
        /// </summary>
        /// <returns></returns>
        public bool IsIssueReadOnly()
        {
            string userName = WebContextBase.Current.Authentication.User.Identity.Name;

            // Admin user can read/update any issue
            if (WebContextBase.Current.Authentication.User.IsInRole(IssueVisionServiceConstant.UserTypeAdmin))
                return false;

            // normal user can only read/update issues assigned to them
            // or issues created by them and have not assigned to anyone.
            if (AssignedToID != null && AssignedToID == userName)
                return false;
            if (AssignedToID == null && OpenedByID == userName)
                return false;

            return true;
        }
    }
}